package com.example.migrator.batch;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class MigrationItemProcessor implements ItemProcessor<Object, Object> {

    private static final Logger logger = LoggerFactory.getLogger(MigrationItemProcessor.class);

    @Override
    public Object process(Object item) throws Exception {
        if (item == null) {
            return null;
        }

        // 处理Map类型的数据（从数据库查询返回的结果）
        if (item instanceof Map) {
            Map<String, Object> sourceMap = (Map<String, Object>) item;
            Map<String, Object> targetMap = new HashMap<>();

            for (Map.Entry<String, Object> entry : sourceMap.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();

                // 类型转换处理
                Object convertedValue = convertOracleTypeToMySQLType(value);
                targetMap.put(key, convertedValue);
            }

            return targetMap;
        }

        // 这里可以添加对其他类型对象的处理逻辑
        // 如果不需要特殊处理，直接返回原始对象
        return item;
    }

    /**
     * 将Oracle特有的数据类型转换为MySQL兼容的类型
     */
    private Object convertOracleTypeToMySQLType(Object value) {
        if (value == null) {
            return null;
        }

        // Oracle的DATE类型转换为MySQL的DATETIME
        if (value instanceof Date && !(value instanceof java.sql.Date)) {
            Date date = (Date) value;
            return new Timestamp(date.getTime());
        }

        // Oracle的NUMBER类型转换为Java的Long或Integer
        if (value instanceof BigDecimal) {
            BigDecimal bd = (BigDecimal) value;
            try {
                // 如果是整数类型，可以转换为Long
                if (bd.scale() <= 0) {
                    if (bd.compareTo(new BigDecimal(Long.MAX_VALUE)) <= 0) {
                        return bd.longValue();
                    } else {
                        return bd.toBigInteger();
                    }
                }
            } catch (Exception e) {
                logger.debug("无法转换BigDecimal为Long: {}", e.getMessage());
            }
            return bd;
        }

        // Oracle的CLOB类型处理（假设已经在MyBatis配置中处理了）
        // 如果需要特殊处理，可以在这里添加

        // Oracle的BLOB类型处理（假设已经在MyBatis配置中处理了）
        // 如果需要特殊处理，可以在这里添加

        // 其他类型保持不变
        return value;
    }
}